/*
 * @Author: lll 1280388921@qq.com
 * @Date: 2025-04-28 11:11:12
 * @LastEditors: lll 1280388921@qq.com
 * @LastEditTime: 2025-04-29 13:22:31
 * @FilePath: /lesson36/mythread.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <thread>
#include <string>
#include <cstdlib>

using namespace std;

string tohex(pthread_t tid)
{
    char hex[64];
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}

void *threadroutine(void *args)
{
    while (1)
    {
        cout << "thread id: " << tohex(pthread_self()) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadroutine, (void *)"thread 1");
    cout << "main thread create thread done,new thread id: " << tohex(tid) << endl;
    pthread_join(tid, nullptr);

    return 0;
}

// void threadrun()
// {
//     while(1)
//     {
//         cout<<"I am a c++ thread"<<endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);
//     t1.join();

//     return 0;
// }

// class Request
// {
// public:
//     Request(int start, int end, const string &threadname)
//         : _start(start), _end(end), _threadname(threadname)
//     {
//     }
// public:
//     int _start;
//     int _end;
//     string _threadname;
// };

// class Response
// {
// public:
//     Response(int ret, int exitcode)
//         : _ret(ret), _exitcode(exitcode)
//     {
//     }
// public:
//     int _ret;      // 计算结果
//     int _exitcode; // 计算结果是否可靠
// };

// void *CountSum(void *args)
// {
//     Request *rq = static_cast<Request *>(args); // Request* rq=(Request*)args;
//     Response *rsp = new Response(0, 0);
//     for (int i = rq->_start; i <= rq->_end; i++)
//     {
//         cout<<rq->_threadname<<" is running ,"<<i<<endl;
//         rsp->_ret += i;
//         usleep(100000);
//     }
//     delete rq;
//     return rsp;
// }

// int main()
// {
//     pthread_t tid;
//     Request *rq = new Request(1, 100, "thread 1");
//     pthread_create(&tid, nullptr, CountSum, rq);

//     void *ret;
//     pthread_join(tid, &ret);
//     Response *rsp = static_cast<Response *>(ret);
//     cout << "ret: " << rsp->_ret << " ,exitcode: " << rsp->_exitcode << endl;
//     delete rsp;

//     return 0;
// }

// void *threadroutine(void *args)
// {
//     const char *name = (const char *)args;
//     int cnt=0;
//     while (1)
//     {
//         cout << name << ": " << getpid() << endl;
//         sleep(1);
//         cnt++;
//         if(cnt==5)
//         {
//             break;
//         }
//     }
//     pthread_exit((void*)100);
//     // exit(11);
//     // return (void*)1;//在这里默认线程就退出了
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadroutine, (void *)"Thread 1");

//     sleep(1);//只是为了保证新线程已经启动

//     pthread_cancel(tid);
//     // while (1)
//     // {
//     //     printf("main thread:%d,create new thread tid:%p\n", getpid(), tid);
//     //     // cout << "main thread: " << getpid() <<" ,create new thread tid: "<<tid<< endl;
//     //     sleep(1);
//     // }
//     void*ret;
//     pthread_join(tid,&ret);//主线程等待默认阻塞等待！
//     cout<<"main thread quit!!ret: "<<(long long int)ret<<endl;
//     return 0;
// }

// int g_val = 0;

// // 可以被多个执行流同时执行
// // 这个函数被重入了！！！
// void show(const string &name)
// {
//     cout << name << " say: hello thread" << endl;
// }

// void *threadroutine(void *args)
// {
//     while (1)
//     {
//         printf("new thread:%d , g_val=%d , &g_val=%p\n", getpid(), g_val, &g_val);
//         // cout << "new thread: " << getpid() <<",g_val= "<<g_val<<",&g_val: "<<&g_val<< endl;
//         // show("[new thread]");
//         sleep(5);
//         int a = 10;
//         a /= 0;
//     }
// }

// int main()
// {
//     pthread_t tid;
//     // typedef unsigned long int pthread_t
//     pthread_create(&tid, nullptr, threadroutine, nullptr);

//     while (1)
//     {
//         printf("main thread:%d , g_val=%d , &g_val=%p\n", getpid(), g_val, &g_val);
//         // cout << "main thread: " << getpid() <<",g_val= "<<g_val<<",&g_val: "<<&g_val<< endl;
//         // show("[main thread]");
//         sleep(1);
//         g_val++;
//     }
//     return 0;
// }
